package com.zhoust.redislock.controller;

import com.zhoust.redislock.service.RedisLock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 15703
 * @version 1.0
 * @Title
 * @package com.zhoust.redislock.controller
 * @date 2021/4/23 11:46
 * @desc
 */
@Slf4j
@RestController
public class RedisLockControllerDome {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("test")
    public String test(){
        return "****";
    }


    @GetMapping("/testRedisLock")
    public String testRedisLock(){

        /**
         * 锁 阻塞
         *
         * 1. 获取锁
         * ()中的代码一般放的是对资源的申请，如果{}中的代码出项了异常，（）中的资源就会被关闭
         * //2. 释放锁
         * 因为 RedisLock 实现了资源关闭类AutoCloseable，所以当try中出现异常时,或者执行完成时自动调用了 RedisLock 中的close方法
         *
         */
       try(RedisLock redisLock = new RedisLock(redisTemplate,"redisKey",30)){
           log.info("开始获取锁。。。");
           if(redisLock.getLock()){
               log.info("todo 开启守护线程");

               log.info("拿到锁。。。执行业务逻辑15秒");
               Thread.sleep(15000);

               log.info("todo 关闭守护线程");

               log.info("释放锁。。");
           }else{
               log.info("锁被占用，没有拿到锁。");
           }
        }catch (Exception e){
            e.printStackTrace();
        }
        return "succeed";
    }

    @GetMapping("/testRedisLock2")
    public String testRedisLock2(){

        /**
         * 锁 阻塞
         *
         * 1. 获取锁
         * ()中的代码一般放的是对资源的申请，如果{}中的代码出项了异常，（）中的资源就会被关闭
         * //2. 释放锁
         * 因为 RedisLock 实现了资源关闭类AutoCloseable，所以当try中出现异常时,或者执行完成时自动调用了 RedisLock 中的close方法
         *
         */
        try(RedisLock redisLock = new RedisLock(redisTemplate,"redisKey",30)){
            log.info("开始获取锁。。。");
            if(redisLock.getLock()){
                log.info("todo 开启守护线程");

                log.info("拿到锁。。。执行业务逻辑15秒");
                Thread.sleep(15000);

                log.info("todo 关闭守护线程");

                log.info("释放锁。。");
            }else{
                log.info("锁被占用，没有拿到锁。");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return "succeed";
    }






}
